package com.atguigu.gmall;

import org.apache.commons.collections.map.HashedMap;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author: 李旭
 * @create: 2021-08-31 16:07
 *
 *    异步编排
 *
 **/
public class CompletableFutureDemo1 {

    public static void main(String[] args) throws Exception{// 主线程
        //自定义线程池
        ThreadPoolExecutor threadPoolExecutor =
                new ThreadPoolExecutor(
                        5,//核心线程数
                        10,//最大线程数  5
                        5,//存活时间：超出核心线程数的线程的存活时间
                        TimeUnit.MINUTES,//单位
                        new ArrayBlockingQueue(10) //队列
                );

        //1:异步编排 子线程能不能处理这个异常  告诉我一声  后期处理  降级处理
        CompletableFuture.supplyAsync(() -> {
            System.out.println("1:runAsync");
            //int i = 1/0;
            System.out.println(Thread.currentThread().getName());
            return "我是上一个任务的返回值";
        },threadPoolExecutor).whenCompleteAsync((t,u) -> {//计算完成时回调方法
            System.out.println("t:" + t);//接收上一个任务的返回值
            System.out.println("u:" + u);//接收上一个任务的异常
            //处理异常
        },threadPoolExecutor).exceptionally((u) -> {
            System.out.println("u:" + u);//接收上一个任务的异常
            //如果没有异常 就不接收 也不需要执行了
            return "异常处理完成";
        });//

        //  whenComplete   :  线程是使用了上一个任务的线程  回调线程是使用了上一个任务的线程
        // whenCompleteAsync ： 在线程池从新获取的新线程


    }
}
